// 利用函数调用的方式实现异步转同步
import flaskApi from "../../api/flaskApi";
export default {
    _member: {
        _max: 2,  // 1会全部等待
        _count: 0,
        _taskQueue: []
    },
    taskMonitor: null,

    createTask (caller, resolve, reject) {
        return () => {
            caller()
                .then(resolve)
                .catch(reject)
                .finally(() => {
                    // debugger
                    this._member._count -= 1
                    if (this._member._taskQueue.length !== 0) {
                        const task = this._member._taskQueue.shift()
                        task()
                    }
                })
        }
    },
    call(caller){
        return new Promise((resolve, reject) => {
            this._member._count += 1
            // debugger
            const task = this.createTask(caller, resolve, reject)
            if (this._member._count >= this._member._max) {
                this._member._taskQueue.push(task)
            } else {
                task()
            }
        })
    },
    cleanTask(){
        // 由于异步的问题，有些时候请求还没加进来，上一个task就执行完毕了，导致后续任务无法执行
        // 比如队列长为2，第一个任务加入后，不满足等待条件立刻执行，后面还有一个任务，还没加入等待队列
        // 第一个任务就执行完毕了，这导致了后续任务无法除法
        // 这个函数就是周期性的去找出这些任务执行（实际上不怎么懂js的异步)
        this.taskMonitor = setInterval(()=>{
            if(this._member._taskQueue.length !== 0){
                this._member._count -= 1
                const task = this._member._taskQueue.shift()
                task()
            }
        }, 1000 * 3.5)
    },
    cleanInterval(){
        clearInterval(this.taskMonitor)
    },
    PostFileAsync(monitor, formData, success, fail){
        return this.call(()=>{
            return new Promise((resolve, reject) => {
                const uploadTask = uni.uploadFile({
                    url: flaskApi.FILE_UPLOAD,
                    filePath: monitor.path,
                    name: 'image',
                    formData: formData,
                    success: success,
                    fail: fail,
                    complete: (res)=>{
                        resolve(res)
                    }
                })
                uploadTask.onProgressUpdate((res) => {
                    monitor.progress = res.progress
                })
            })
        })
    }
}

